/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.opt.detailcampagne.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.opt.detailcampagne.builder.DTOCampagneDetailCampBuilder;
import fr.generali.accueilclient.opt.detailcampagne.builder.DTOFamilleProduitDetailCampBuilder;
import fr.generali.accueilclient.opt.detailcampagne.builder.DTOObjectifsDetailCampBuilder;
import fr.generali.accueilclient.opt.detailcampagne.builder.DTOOffreCommercialeDetailCampBuilder;
import fr.generali.accueilclient.opt.detailcampagne.om.ICampagneDetailCamp;
import fr.generali.accueilclient.opt.detailcampagne.om.ICritereEntreeDetailCamp;
import fr.generali.accueilclient.opt.detailcampagne.om.IFamilleProduitDetailCamp;
import fr.generali.accueilclient.opt.detailcampagne.om.IObjectifsDetailCamp;
import fr.generali.accueilclient.opt.detailcampagne.om.IOffreCommercialeDetailCamp;
import fr.generali.relationclient.marketing.opt.detailcampagne.DtoCampagne;
import fr.generali.relationclient.marketing.opt.detailcampagne.DtoCritereEntree;
import fr.generali.relationclient.marketing.opt.detailcampagne.DtoFamilleProduit;
import fr.generali.relationclient.marketing.opt.detailcampagne.DtoObjectifs;
import fr.generali.relationclient.marketing.opt.detailcampagne.DtoOffreCommerciale;
import fr.generali.relationclient.marketing.opt.detailcampagne.builder.DtoCritereEntreeBuilder;

/**
 * @author Holmes Kelly
 */

@Component("detailCampagneMapper")
public class DetailCampagneMapper {

    /**
     * @param critereEntree criteres entree
     * @return DtoCritereEntree
     */
    public DtoCritereEntree mapperCritereEntree2DtoCritereEntree(ICritereEntreeDetailCamp critereEntree) {

        DtoCritereEntree dtoCritereEntree = null;

        if (critereEntree != null) {

            dtoCritereEntree = DtoCritereEntreeBuilder.dtoCritereEntree()
                            .buildIdentifiant(critereEntree.getIdentifiant())
                            .build();
        }

        return dtoCritereEntree;
    }

    /**
     * @param dtoCampagne dtoCampagne
     * @return ICampagne
     */
    public ICampagneDetailCamp mapperDtoCampagne2ICampagne(DtoCampagne dtoCampagne) {

        ICampagneDetailCamp campagneDetailCamp = null;

        if (dtoCampagne != null) {

            campagneDetailCamp = DTOCampagneDetailCampBuilder.dTOCampagneDetailCamp()
                            .buildCategorie(dtoCampagne.getCategorie())
                            .buildCodeCampagneAffinium(dtoCampagne.getCodeCampagneAffinium())
                            .buildCodeSegment(dtoCampagne.getCodeSegment())
                            .buildDescription(dtoCampagne.getDescription())
                            .buildEndDate(dtoCampagne.getEndDate())
                            .buildIdentifiant(dtoCampagne.getIdentifiant())
                            .buildLibelleMedia(dtoCampagne.getLibelleMedia())
                            .buildLibelleStatutCampagne(dtoCampagne.getLibelleStatutCampagne())
                            .buildLibelleTypeCampagne(dtoCampagne.getLibelleTypeCampagne())
                            .buildMarche(dtoCampagne.getMarche())
                            .buildNbExecutions(dtoCampagne.getNbExecutions())
                            .buildNom(dtoCampagne.getNom())
                            .buildStartDate(dtoCampagne.getStartDate())
                            .buildFamille(buildListeFamilleProduit(dtoCampagne.getFamille()))
                            .buildObjectifs(buildListeObjectifs(dtoCampagne.getObjectifs()))
                            .buildOffres(buildListeOffreCommerciale(dtoCampagne.getOffres()))
                            .build();

        }

        return campagneDetailCamp;
    }

    /**
     * @param listeDtoOffreCommerciales liste DtoOffreCommerciale
     * @return liste IOffreCommercialeDetailCamp
     */
    private List<IOffreCommercialeDetailCamp> buildListeOffreCommerciale(
                    List<DtoOffreCommerciale> listeDtoOffreCommerciales) {

        List<IOffreCommercialeDetailCamp> listeOffreCommercialeDetailCamps = null;

        if (CollectionUtils.isNotEmpty(listeDtoOffreCommerciales)) {

            listeOffreCommercialeDetailCamps = new ArrayList<IOffreCommercialeDetailCamp>();

            CollectionUtils.collect(listeDtoOffreCommerciales,
                            getTransformerDtoOffreCommerciale2IOffreCommercialeDetailCamp(),
                            listeOffreCommercialeDetailCamps);
        }

        return listeOffreCommercialeDetailCamps;
    }

    /**
     * @param listeDtoFamilleProduits liste DtoFamilleProduits
     * @return liste IFamilleProduitDetailCamp
     */
    private List<IFamilleProduitDetailCamp> buildListeFamilleProduit(List<DtoFamilleProduit> listeDtoFamilleProduits) {

        List<IFamilleProduitDetailCamp> listeFamilleProduitDetailCamps = null;

        if (CollectionUtils.isNotEmpty(listeDtoFamilleProduits)) {

            listeFamilleProduitDetailCamps = new ArrayList<IFamilleProduitDetailCamp>();

            CollectionUtils
                            .collect(listeDtoFamilleProduits,
                                            getTransformerDtoFamilleProduit2IFamilleProduitDetailCamp(),
                                            listeFamilleProduitDetailCamps);
        }

        return listeFamilleProduitDetailCamps;
    }

    /**
     * @param listeDtoObjectifs liste DtoObjectifs
     * @return liste IObjectifsDetailCamp
     */
    private List<IObjectifsDetailCamp> buildListeObjectifs(List<DtoObjectifs> listeDtoObjectifs) {

        List<IObjectifsDetailCamp> listeObjectifsDetailCamps = null;

        if (CollectionUtils.isNotEmpty(listeDtoObjectifs)) {

            listeObjectifsDetailCamps = new ArrayList<IObjectifsDetailCamp>();

            CollectionUtils.collect(listeDtoObjectifs, getTransformerDtoObjectifs2IObjectifsDetailCamp(),
                            listeObjectifsDetailCamps);

        }

        return listeObjectifsDetailCamps;

    }

    /**
     * @return transformer DtoOffreCommerciale -> IOffreCommercialeDetailCamp
     */
    private Transformer getTransformerDtoOffreCommerciale2IOffreCommercialeDetailCamp() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoOffreCommerciale dtoOffreCommerciale = DtoOffreCommerciale.class.cast(input);

                IOffreCommercialeDetailCamp offreCommercialeDetailCamp =
                                DTOOffreCommercialeDetailCampBuilder.dTOOffreCommercialeDetailCamp()
                                                .buildDateDebImpact(dtoOffreCommerciale.getDateDebImpact())
                                                .buildDateFinImpact(dtoOffreCommerciale.getDateFinImpact())
                                                .buildIdentifiant(dtoOffreCommerciale.getIdentifiant())
                                                .buildLibelle(dtoOffreCommerciale.getLibelle())
                                                .build();

                return offreCommercialeDetailCamp;
            }
        };

        return transformer;
    }

    /**
     * @return transformer DtoFamilleProduit -> IFamilleProduitDetailCamp
     */
    private Transformer getTransformerDtoFamilleProduit2IFamilleProduitDetailCamp() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoFamilleProduit dtoFamilleProduit = DtoFamilleProduit.class.cast(input);

                IFamilleProduitDetailCamp familleProduitDetailCamp =
                                DTOFamilleProduitDetailCampBuilder.dTOFamilleProduitDetailCamp()
                                                .buildIdentifiant(dtoFamilleProduit.getIdentifiant())
                                                .buildNom(dtoFamilleProduit.getNom())
                                                .build();

                return familleProduitDetailCamp;
            }
        };

        return transformer;
    }

    /**
     * @return transformer DtoObjectifs->IObjectifsDetailCamp
     */
    private Transformer getTransformerDtoObjectifs2IObjectifsDetailCamp() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoObjectifs dtoObjectifs = DtoObjectifs.class.cast(input);

                IObjectifsDetailCamp objectifsDetailCamp = DTOObjectifsDetailCampBuilder.dTOObjectifsDetailCamp()
                                .buildIdentifiant(dtoObjectifs.getIdentifiant())
                                .buildNom(dtoObjectifs.getNom())
                                .build();

                return objectifsDetailCamp;
            }
        };

        return transformer;
    }

}
